﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Data;
using produccion.reportes;
using System.Windows.Controls.Primitives;
using System.Threading;
using System.Globalization;
using System.Collections;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmModificacionesDeNomina.xaml
    /// </summary>
    public partial class FrmModificacionesDeNomina : Window
    {
        #region FJRF - Variables del modulo
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        DataTable DtDatosConsultados;//FJRF - Usamos este DataTable para hacer consultas del grid
        DataTable DtDatosConsultadosNomina;//FJRF - Usamos este DataTable para hacer consultas del grid

        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        #endregion

        #region FJRF - Objetos del formulario
        public FrmModificacionesDeNomina()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            #region FJRF - Titulo del formulario y funcion para las fechas
            string strTituloVentana = "MODIFICACIONES DE NOMINA" + " - Usuario:" + MDOgeneral.usuario + " - [FrmModificacionesDeNomina]";//FJRF - Armamos el titulo de la ventana
            Title = strTituloVentana;//FJRF - Ponemos el titulo de la ventana.

            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
            #endregion

            #region FJRF - Le quitamos los estilos a los objetos para poder controlar el foco
            RdbProduccion.Style = null;//FJRF - Le quitamos el estilo al objeto
            RdbNovedades.Style = null;//FJRF - Le quitamos el estilo al objeto
            CboAño.Style = null;//FJRF - Le quitamos el estilo al objeto
            CboSemana.Style = null;//FJRF - Le quitamos el estilo al objeto
            CboProcesoSeleccionado.Style = null;//FJRF - Le quitamos el estilo al objeto
            #endregion
        }
        private void RdbProduccion_Checked(object sender, RoutedEventArgs e)
        {
            StrConsulta = "SELECT UPPER(ANO_RPP) AS ANO_RPP FROM REPPRO GROUP BY ANO_RPP ORDER BY TO_NUMBER(ANO_RPP) DESC ";
            CargarCombo(CboAño, StrConsulta, "ANO_RPP", "ANO_RPP");
            CboAño.Focus();//FJRF - Enviamos el foco al año
            ComboEnPosicionConNombre(CboAño, "Digite o seleccione");//FJRF - Ponemos el combo en esta posicion
        }
        private void RdbNovedades_Checked(object sender, RoutedEventArgs e)
        {
            StrConsulta = "SELECT UPPER(ANO_NVP) AS ANO_NVP FROM NOVPRD GROUP BY ANO_NVP ORDER BY TO_NUMBER(ANO_NVP) DESC ";
            CargarCombo(CboAño, StrConsulta, "ANO_NVP", "ANO_NVP");
            CboAño.Focus();//FJRF - Enviamos el foco al año
            ComboEnPosicionConNombre(CboAño, "Digite o seleccione");//FJRF - Ponemos el combo en esta posicion
        }
        private void CboAño_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (RdbProduccion.IsChecked == true || RdbNovedades.IsChecked == true)//FJRF - Si chequedado cualquiera de los dos hacemos lo siguiente
            {
                if (CboAño.SelectedValue != null)
                {
                    if (CboAño.SelectedValue.ToString() != "Digite o seleccione")
                    {
                        if (RdbProduccion.IsChecked == true)//FJRF - Si produccion esta chequedado hacemos lo siguiente
                        {
                            StrConsulta = "SELECT UPPER(SEM_RPP) AS SEM_RPP ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "FROM REPPRO, semanasp ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "WHERE ANO_RPP = ano_sem ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "AND ANO_RPP = '" + CboAño.SelectedValue + "' ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "GROUP BY SEM_RPP ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "ORDER BY TO_NUMBER(SEM_RPP) ASC ";//FJRF - Armamos la consulta

                            CargarCombo(CboSemana, StrConsulta, "SEM_RPP", "SEM_RPP");//FJRF - Cargamos el combo
                            ComboEnPosicionConNombre(CboSemana, "Digite o seleccione");//FJRF - Ponemos el combo en esta posicion
                        }
                        else
                        {
                            StrConsulta = "SELECT UPPER(SEM_NVP) AS SEM_NVP ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "FROM NOVPRD, semanasp ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "WHERE ANO_NVP = ano_sem ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "AND ANO_NVP = '" + CboAño.SelectedValue + "' ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "GROUP BY SEM_NVP ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "ORDER BY TO_NUMBER(SEM_NVP) ASC ";//FJRF - Armamos la consulta

                            CargarCombo(CboSemana, StrConsulta, "SEM_NVP", "SEM_NVP");//FJRF - Cargamos el combo
                            ComboEnPosicionConNombre(CboSemana, "Digite o seleccione");//FJRF - Ponemos el combo en esta posicion
                        }
                    }
                }
            }
        }
        private void CboSemana_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            DtgDatosAModificar.ItemsSource = null;//FJRF - Desvinculamos el objeto
            DtDatosConsultados = null;//FJRF - Borramos los datos que pueda tener el objeto
            DtgDatosAModificar.Items.Clear();//FJRF - Limpiamos los objetos

            CboProcesoSeleccionado.ItemsSource = null;//FJRF - Desvinculamos el objeto
            CboProcesoSeleccionado.Items.Clear();//FJRF - Limpiamos los objetos

            if (CboSemana.SelectedValue == null)
            {
                return;
            }
            if (CboSemana.SelectedValue.ToString() == "Digite o seleccione")
            {
                LblDesde.Content = "_ _ /_ _ /_ _ _ _";//FJRF - simulamos un limpiado de fecha
                LblHasta.Content = "_ _ /_ _ /_ _ _ _";//FJRF - simulamos un limpiado de fecha
            }
            else
            {
                #region FJRF - Traemos la semana seleccionada
                StrConsulta = "Select desde_sem, hasta_sem from semanasp where ano_sem = '" + CboAño.SelectedValue + "' And nrosem_sem = '" + CboSemana.SelectedValue + "' ";//FJRF - Hacemos la consulta
                DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Realizamos la consulta y retornamos los datos
                if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
                {
                    LblDesde.Content = Convert.ToDateTime(DtConsulta.Rows[0][0].ToString()).ToShortDateString();//FJRF - Armamos la fecha en un formato correcto
                    LblHasta.Content = Convert.ToDateTime(DtConsulta.Rows[0][1].ToString()).ToShortDateString();//FJRF - Armamos la fecha en un formato corresto
                }
                else//FJRF - Si no hay datos hacemos lo siguiente
                {
                    LblDesde.Content = "_ _ /_ _ /_ _ _ _";//FJRF - simulamos un limpiado de fecha
                    LblHasta.Content = "_ _ /_ _ /_ _ _ _";//FJRF - simulamos un limpiado de fecha
                }
                #endregion

                if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
                {
                    if (RdbProduccion.IsChecked == true || RdbNovedades.IsChecked == true)//FJRF - Si chequedado cualquiera de los dos hacemos lo siguiente
                    {
                        if (RdbProduccion.IsChecked == true)//FJRF - Si produccion esta chequedado hacemos lo siguiente
                        {
                            StrConsulta = "SELECT CODPRC_RPP AS CODIGO, UPPER(NOMPRC_PPR) AS NOMBRE ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "FROM REPPRO, prcprd ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "WHERE ANO_RPP = '" + CboAño.SelectedValue + "' ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "AND SEM_RPP = '" + CboSemana.SelectedValue + "' ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "AND CODPRC_RPP = CODPRC_PPR ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "GROUP BY CODPRC_RPP, NOMPRC_PPR ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "ORDER BY NOMPRC_PPR ";//FJRF - Armamos la consulta

                            CargarCombo(CboProcesoSeleccionado, StrConsulta, "CODIGO", "NOMBRE");//FJRF - Llenamos el combo
                            ComboEnPosicionConNombre(CboProcesoSeleccionado, "Digite o seleccione");//FJRF - Ponemos el combo en esta posicion
                        }
                        else//FJRF - Si no esta chequedado produccion significa que entro por novedades y hacemos lo siguiente
                        {
                            StrConsulta = "SELECT CODPRC_NVP AS CODIGO, UPPER(NOMPRC_PPR) AS NOMBRE ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "FROM NOVPRD, prcprd ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "WHERE ANO_NVP = '" + CboAño.SelectedValue + "' ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "AND SEM_NVP = '" + CboSemana.SelectedValue + "' ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "AND CODPRC_NVP = CODPRC_PPR ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "GROUP BY CODPRC_NVP, NOMPRC_PPR ";//FJRF - Armamos la consulta
                            StrConsulta = StrConsulta + "ORDER BY NOMPRC_PPR ";//FJRF - Armamos la consulta

                            CargarCombo(CboProcesoSeleccionado, StrConsulta, "CODIGO", "NOMBRE");//FJRF - Llenamos el combo
                            ComboEnPosicionConNombre(CboProcesoSeleccionado, "Digite o seleccione");//FJRF - Ponemos el combo en esta posicion
                        }
                    }
                }
            }
        }
        private void CboProcesoSeleccionado_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            PttV_BuscarDatos();//FJRF - Buscamos los datos
        }
        protected void PttV_BuscarDatos()
        {
            if (CboProcesoSeleccionado.Items.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
            {
                #region FJRF - Limpiamos los datos del grid
                DtgDatosAModificar.ItemsSource = null;
                DtgDatosAModificar1.ItemsSource = null;

                DtDatosConsultados = null;
                
                DtgDatosAModificar.Items.Clear();
                DtgDatosAModificar1.Items.Clear();

                #endregion

                if (RdbProduccion.IsChecked == true || RdbNovedades.IsChecked == true)//FJRF - Si chequedado cualquiera de los dos hacemos lo siguiente
                {
                    if (RdbProduccion.IsChecked == true)//FJRF - Si produccion esta chequedado hacemos lo siguiente
                    {
                        DtgDatosAModificar1.Visibility = Visibility.Hidden;
                        DtgDatosAModificar.Visibility = Visibility.Visible;

                        StrConsulta = "SELECT NROORD_RPP AS ORDEN, CONSEC_RPP AS CONSEC, CODEMP_RPP AS CODEMP, '' AS EMPLEADO,  CANREP_RPP AS CANTIDAD,  PORCEN_RPP AS PORCENTAJE,  VLRCTG_RPP AS VLRCTG,  VLRVLR_RPP AS VALOR, 'NO' AS SELECCIONADO, '/produccion;component/Images/ImagenTrasparente.png' AS ELIMINAR ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "FROM REPPRO ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "WHERE ANO_RPP = '" + CboAño.SelectedValue + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND SEM_RPP = '" + CboSemana.SelectedValue + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND CODPRC_RPP = '" + CboProcesoSeleccionado.SelectedValue + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "ORDER BY NROORD_RPP ";//FJRF - Armamos la consulta

                        DtDatosConsultados = MdoGeneral.consulta(StrConsulta);
                        DtgDatosAModificar.ItemsSource = DtDatosConsultados.DefaultView;

                        #region FJRF - Buscamos el nombre del empleado o equipo
                        if (DtDatosConsultados.Rows.Count > 0)//FJRF - Si la busqueda tiene datos hacemos lo siguiente
                        {
                            for (int IntFilaActual = 0; IntFilaActual < DtDatosConsultados.Rows.Count; IntFilaActual++)//FJRF - Recorremos los datos que retorna
                            {
                                String StrCodigoEmpleadoOCodigoEquipo = DtDatosConsultados.Rows[IntFilaActual][2].ToString();//FJRF - Extraemos el que se retorno en el formulario que trae las materias primas con los colores y lo trae en la columna cero [0] de la fila que se esta recorriendo

                                String StrNombreEmpleadoOEquipo = MdoGeneral.StrRetornarUnSoloCampo("NOMEMP_EMP", "EMPLEADO", "MAEEMPP", "CODEMP_EMP = '" + StrCodigoEmpleadoOCodigoEquipo + "'");//FJRF - Buscamos el nombre del empleado
                                if (StrNombreEmpleadoOEquipo == "DATO NO ENCONTRADO")//FJRF - Si no lo encontro hacemos lo siguiente
                                {
                                    StrNombreEmpleadoOEquipo = MdoGeneral.StrRetornarUnSoloCampo("CODEQU_EQU", "EQUIPO", "MAEEQU", "CODEQU_EQU = '" + StrCodigoEmpleadoOCodigoEquipo + "'");//FJRF - Buscamos el nombre del empleado

                                    if (StrNombreEmpleadoOEquipo == "DATO NO ENCONTRADO")//FJRF - Si el dato buscado no existe hacemos lo siguiente
                                    {
                                        DtDatosConsultados.Rows[IntFilaActual][3] = "NO EXISTE";//FJRF - Informamos que el dato no existe
                                    }
                                    else
                                    {
                                        DtDatosConsultados.Rows[IntFilaActual][3] = "ES UN EQUIPO";//FJRF - Informamos que es un equipo
                                    }
                                }
                                else//FJRF - Si encontro el empleado hacemo lo siguiente
                                {
                                    DtDatosConsultados.Rows[IntFilaActual][3] = StrNombreEmpleadoOEquipo;//FJRF - Asignamos el nombre del empleado
                                }
                            }

                            DtgDatosAModificar.Columns[8].Visibility = Visibility.Hidden;//FJRF - Ocultamos la columna que controla el eliminar
                        }
                        #endregion

                        #region FJRF - Aplicar formato a la columna
                        if (DtgDatosAModificar.Items.Count > 0)//FJRF - Si el grid tiene datos hacemos lo siguiente
                        {
                            foreach (var ColumnaGrid in DtgDatosAModificar.Columns)//FJRF - Recorremos el grid
                            {
                                string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
                                strNombreColumna = DtgDatosAModificar.Columns[ColumnaGrid.DisplayIndex].Header.ToString();//FJRF - Extraemos el titulo que tenga la columna

                                if (strNombreColumna == "CANTIDAD" || strNombreColumna == "PORCENTAJE" || strNombreColumna == "VLRCTG" || strNombreColumna == "VALOR")//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
                                {
                                    Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                                    MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                                    (ColumnaGrid as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda pero dejando un blanco si no tiene cero
                                    (ColumnaGrid as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado
                                }
                            }
                        }
                        #endregion
                    }
                    else//FJRF - Si no esta chequedado produccion significa que entro por novedades y hacemos lo siguiente
                    {
                        DtgDatosAModificar.Visibility = Visibility.Hidden;
                        DtgDatosAModificar1.Visibility = Visibility.Visible;

                        StrConsulta = "SELECT CONSEC_NVP AS CONSEC, CODEMP_NVP AS CODEMP, '' AS EMPLEADO, TRIM(UPPER(CONCEP_NVP)) AS CONCEPTO,  VLRNOV_NVP AS VALOR, 'NO' AS SELECCIONADO, '/produccion;component/Images/ImagenTrasparente.png' AS ELIMINAR ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "FROM NOVPRD ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "WHERE ANO_NVP = '" + CboAño.SelectedValue + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND SEM_NVP = '" + CboSemana.SelectedValue + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "AND CODPRC_NVP = '" + CboProcesoSeleccionado.SelectedValue + "' ";//FJRF - Armamos la consulta
                        StrConsulta = StrConsulta + "ORDER BY CONSEC_NVP ";//FJRF - Armamos la consulta

                        DtDatosConsultados = MdoGeneral.consulta(StrConsulta);
                        DtgDatosAModificar1.ItemsSource = DtDatosConsultados.DefaultView;

                        #region FJRF - Buscamos el nombre del empleado o equipo
                        if (DtDatosConsultados.Rows.Count > 0)//FJRF - Si la busqueda tiene datos hacemos lo siguiente
                        {
                            for (int IntFilaActual = 0; IntFilaActual < DtDatosConsultados.Rows.Count; IntFilaActual++)//FJRF - Recorremos los datos que retorna
                            {
                                String StrCodigoEmpleadoOCodigoEquipo = DtDatosConsultados.Rows[IntFilaActual][1].ToString();//FJRF - Extraemos el que se retorno en el formulario que trae las materias primas con los colores y lo trae en la columna cero [0] de la fila que se esta recorriendo

                                String StrNombreEmpleadoOEquipo = MdoGeneral.StrRetornarUnSoloCampo("NOMEMP_EMP", "EMPLEADO", "MAEEMPP", "CODEMP_EMP = '" + StrCodigoEmpleadoOCodigoEquipo + "'");//FJRF - Buscamos el nombre del empleado
                                if (StrNombreEmpleadoOEquipo == "DATO NO ENCONTRADO")//FJRF - Si no lo encontro hacemos lo siguiente
                                {
                                    StrNombreEmpleadoOEquipo = MdoGeneral.StrRetornarUnSoloCampo("CODEQU_EQU", "EQUIPO", "MAEEQU", "CODEQU_EQU = '" + StrCodigoEmpleadoOCodigoEquipo + "'");//FJRF - Buscamos el nombre del empleado

                                    if (StrNombreEmpleadoOEquipo == "DATO NO ENCONTRADO")//FJRF - Si el dato buscado no existe hacemos lo siguiente
                                    {
                                        DtDatosConsultados.Rows[IntFilaActual][2] = "NO EXISTE";//FJRF - Informamos que el dato no existe
                                    }
                                    else//FJRF - Si no encuentra el dato hacemos lo siguiente
                                    {
                                        DtDatosConsultados.Rows[IntFilaActual][2] = "ES UN EQUIPO";//FJRF - Informamos que es un equipo
                                    }
                                }
                                else//FJRF - Si encontro el empleado hacemo lo siguiente
                                {
                                    DtDatosConsultados.Rows[IntFilaActual][2] = StrNombreEmpleadoOEquipo;//FJRF - Asignamos el nombre del empleado
                                }
                            }

                            DtgDatosAModificar1.Columns[5].Visibility = Visibility.Hidden;//FJRF - Ocultamos la columna que controla el eliminar
                        }
                        #endregion

                        #region FJRF - Aplicar formato a la columna
                        if (DtgDatosAModificar1.Items.Count > 0)//FJRF - Si el grid tiene datos hacemos lo siguiente
                        {
                            foreach (var ColumnaGrid in DtgDatosAModificar1.Columns)//FJRF - Recorremos el grid
                            {
                                string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
                                strNombreColumna = DtgDatosAModificar1.Columns[ColumnaGrid.DisplayIndex].Header.ToString();//FJRF - Extraemos el titulo que tenga la columna

                                if (strNombreColumna == "CANTIDAD" || strNombreColumna == "PORCENTAJE" || strNombreColumna == "VLRCTG" || strNombreColumna == "VALOR")//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
                                {
                                    Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                                    MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                                    (ColumnaGrid as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda pero dejando un blanco si no tiene cero
                                    (ColumnaGrid as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado
                                }
                            }
                        }
                        #endregion
                    }

                }
            }
        }
        public class MyDataObject
        {
            public Uri ImageFilePath { get; set; }
        }
        private void CboAño_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario presiona enter hacemos lo siguiente
            {
                CboSemana.Focus();//FJRF - Enviamos el foco a este objeto
            }
        }
        private void CboSemana_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario presiona enter hacemos lo siguiente
            {
                CboProcesoSeleccionado.Focus();//FJRF - Enviamos el foco a este objeto
            }
        }
        private void CboProcesoSeleccionado_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)//FJRF - Si el usuario presiona enter hacemos lo siguiente
            {
                if (DtDatosConsultados != null)//FJRF - Si no es nulo hacemos lo siguiente
                {
                    if (DtDatosConsultados.Rows.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
                    {
                        DtgDatosAModificar.CurrentCell = new DataGridCellInfo(DtgDatosAModificar.Items[0], DtgDatosAModificar.Columns[4]);//FJRF - Decimos en que fila y columna vamos a trabajar
                        DtgDatosAModificar.BeginEdit();//FJRF - Decimos que es para edicion
                    }
                }
            }
        }
        private void DtgDatosAModificar_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (RdbProduccion.IsChecked == true || RdbNovedades.IsChecked == true)//FJRF - Si chequedado cualquiera de los dos hacemos lo siguiente
            {
                if (RdbProduccion.IsChecked == true)//FJRF - Si produccion esta chequedado hacemos lo siguiente
                {
                    #region FJRF - Saber Fila y Columna indexada

                    int IntColumnaIndexada, IntFilaIndexada;
                    DependencyObject dep = (DependencyObject)e.OriginalSource;

                    //Stepping through the visual tree
                    while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
                    {
                        dep = VisualTreeHelper.GetParent(dep);
                    }

                    //Is the dep a cell or outside the bounds of Window1?
                    if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
                    {
                        return;
                    }
                    else
                    {
                        System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                        cell = (System.Windows.Controls.DataGridCell)dep;
                        while ((dep != null) && !(dep is DataGridRow))
                        {
                            dep = VisualTreeHelper.GetParent(dep);
                        }

                        if (dep == null)
                        {
                            return;
                        }
                        int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                        IntColumnaIndexada = colindex;

                        DataGridRow row = dep as DataGridRow;
                        System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                        int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                        IntFilaIndexada = rowindex;
                    }
                    #endregion

                    String StrOrden = DtDatosConsultados.Rows[IntFilaIndexada][0].ToString();//FJRF - Decimos que en la columna 0 nos traiga el dato de la fila seleccionada

                    FRMconsordens _co = new FRMconsordens();
                    _co.texOrd.Text = StrOrden;
                    _co.texPed.Text = "0";
                    _co.texRef.Text = "";
                    _co.comCli.SelectedIndex = -1;
                    _co.comCol.SelectedIndex = -1;
                    _co.comSub.SelectedItem = -1;
                    _co.datePicker1.SelectedDate = Convert.ToDateTime("01/01/" + DateTime.Now.Year.ToString());
                    _co.filtraOrd();
                    _co.ShowDialog();
                }
            }
        }
        private void DtgDatosAModificar_PreviewMouseUp(object sender, MouseButtonEventArgs e)
        {
            if (RdbProduccion.IsChecked == true || RdbNovedades.IsChecked == true)//FJRF - Si chequedado cualquiera de los dos hacemos lo siguiente
            {
                #region FJRF - Saber Fila y Columna indexada

                int IntColumnaIndexada, IntFilaIndexada;
                DependencyObject dep = (DependencyObject)e.OriginalSource;

                //Stepping through the visual tree
                while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                //Is the dep a cell or outside the bounds of Window1?
                if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
                {
                    return;
                }
                else
                {
                    System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                    cell = (System.Windows.Controls.DataGridCell)dep;
                    while ((dep != null) && !(dep is DataGridRow))
                    {
                        dep = VisualTreeHelper.GetParent(dep);
                    }

                    if (dep == null)
                    {
                        return;
                    }
                    int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                    IntColumnaIndexada = colindex;

                    DataGridRow row = dep as DataGridRow;
                    System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                    int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                    IntFilaIndexada = rowindex;
                }
                #endregion

                int IntColumnaImagen = DtgDatosAModificar.Columns.Count - 1;//FJRF - Esta es la columnas de las imagenes
                int IntColumnaSeleccionado = DtgDatosAModificar.Columns.Count - 2;//FJRF - Esta es la columnas que nos dice si esta o no seleccionado

                if (IntColumnaIndexada == IntColumnaImagen)//FJRF - Si la columnas es la que tiene el chek hacemos lo siguiente
                {
                    String StrSeleccionado = DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaSeleccionado].ToString();//FJRF - Convertimos el objeto en algo manipulable
                    if (StrSeleccionado == "SI")//FJRF - Si esta seleccionado hacemos lo siguiente
                    {
                        DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaSeleccionado] = "NO";//FJRF - Quitamos la seleccion
                        DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaImagen] = "/produccion;component/Images/ImagenTrasparente.png";//FJRF - Ponemos una imagen trasparente

                        CkbSeleccionarTodo.IsChecked = false;//FJRF - Quitamos la seleccion de todos en el seleccionador
                    }
                    if (StrSeleccionado == "NO")//FJRF - Si no esta seleccionado hacemos lo siguiente
                    {
                        DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaSeleccionado] = "SI";//FJRF - Seleccionamos
                        DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaImagen] = "/produccion;component/Images/ok1.png";//FJRF - Ponemos una imagen de seleccion
                    }
                }
            }
        }
        private void DtgDatosAModificar_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (RdbProduccion.IsChecked == true || RdbNovedades.IsChecked == true)//FJRF - Si chequedado cualquiera de los dos hacemos lo siguiente
            {
                #region FJRF - Saber Fila y Columna indexada

                int IntColumnaIndexada, IntFilaIndexada;
                DependencyObject dep = (DependencyObject)e.OriginalSource;

                //Stepping through the visual tree
                while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                //Is the dep a cell or outside the bounds of Window1?
                if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
                {
                    return;
                }
                else
                {
                    System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                    cell = (System.Windows.Controls.DataGridCell)dep;
                    while ((dep != null) && !(dep is DataGridRow))
                    {
                        dep = VisualTreeHelper.GetParent(dep);
                    }

                    if (dep == null)
                    {
                        return;
                    }
                    int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                    IntColumnaIndexada = colindex;

                    DataGridRow row = dep as DataGridRow;
                    System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                    int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                    IntFilaIndexada = rowindex;
                }
                #endregion

                int IntFilaActual, IntCantidadRegistros, IntRegistrosActuales;//FJRF Creamos las variables que necesitamos para el proceso actual

                IntCantidadRegistros = DtgDatosAModificar.Items.Count;//FJRF - Traemos la cantidad de filas que tenga el grid

                IntFilaActual = IntFilaIndexada + 1;//FJRF - La fila actual es la fila indexada mas uno porque empieza en cero
                IntRegistrosActuales = IntCantidadRegistros - 1;//FJRF - Los registros actuales es la cantidad de filas menos una porque siempre debe de sobrar una

                if (RdbProduccion.IsChecked == true)//FJRF - Si produccion esta chequedado hacemos lo siguiente
                {
                    #region FJRF - CodigoParaPasarElFocoDentroDelGridProduccion
                    var elemento = e.OriginalSource as UIElement;
                    if (e.Key == Key.Enter && elemento != null)
                    {
                        if (IntColumnaIndexada == 7 || IntColumnaIndexada == 8 || IntColumnaIndexada == 9)//FJRF - Si la columna equivale al codigo hacemos lo siguiente
                        {
                            if (IntFilaIndexada < IntRegistrosActuales)
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                SelectCellByIndex(DtgDatosAModificar, IntFilaActual, 4);//FJRF - Le decimos cual es la nueva posicion
                            }
                            else
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                SelectCellByIndex(DtgDatosAModificar, 0, 4);//FJRF - Le decimos cual es la nueva posicion
                            }
                        }
                        else//FJRF - si no es la columna de control hacemos lo siguiente
                        {
                            e.Handled = true;
                            elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                        }
                    }
                    #endregion
                }
                else//FJRF - Si entro por novedades hacemos lo siguiente
                {
                    #region FJRF - CodigoParaPasarElFocoDentroDelGridNovedades
                    var elemento = e.OriginalSource as UIElement;
                    if (e.Key == Key.Enter && elemento != null)
                    {
                        if (IntColumnaIndexada == 4 || IntColumnaIndexada == 5 || IntColumnaIndexada == 6)//FJRF - Si la columna equivale al codigo hacemos lo siguiente
                        {
                            if (IntFilaIndexada < IntRegistrosActuales)
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                SelectCellByIndex(DtgDatosAModificar, IntFilaActual, 4);//FJRF - Le decimos cual es la nueva posicion
                            }
                            else
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                SelectCellByIndex(DtgDatosAModificar, 0, 4);//FJRF - Le decimos cual es la nueva posicion
                            }
                        }
                        else//FJRF - si no es la columna de control hacemos lo siguiente
                        {
                            e.Handled = true;
                            elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                        }
                    }
                    #endregion
                }
            }
        }


        private void DtgDatosAModificar1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (RdbProduccion.IsChecked == true || RdbNovedades.IsChecked == true)//FJRF - Si chequedado cualquiera de los dos hacemos lo siguiente
            {
                if (RdbProduccion.IsChecked == true)//FJRF - Si produccion esta chequedado hacemos lo siguiente
                {
                    #region FJRF - Saber Fila y Columna indexada

                    int IntColumnaIndexada, IntFilaIndexada;
                    DependencyObject dep = (DependencyObject)e.OriginalSource;

                    //Stepping through the visual tree
                    while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
                    {
                        dep = VisualTreeHelper.GetParent(dep);
                    }

                    //Is the dep a cell or outside the bounds of Window1?
                    if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
                    {
                        return;
                    }
                    else
                    {
                        System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                        cell = (System.Windows.Controls.DataGridCell)dep;
                        while ((dep != null) && !(dep is DataGridRow))
                        {
                            dep = VisualTreeHelper.GetParent(dep);
                        }

                        if (dep == null)
                        {
                            return;
                        }
                        int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                        IntColumnaIndexada = colindex;

                        DataGridRow row = dep as DataGridRow;
                        System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                        int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                        IntFilaIndexada = rowindex;
                    }
                    #endregion

                    String StrOrden = DtDatosConsultados.Rows[IntFilaIndexada][0].ToString();//FJRF - Decimos que en la columna 0 nos traiga el dato de la fila seleccionada

                    FRMconsordens _co = new FRMconsordens();
                    _co.texOrd.Text = StrOrden;
                    _co.texPed.Text = "0";
                    _co.texRef.Text = "";
                    _co.comCli.SelectedIndex = -1;
                    _co.comCol.SelectedIndex = -1;
                    _co.comSub.SelectedItem = -1;
                    _co.datePicker1.SelectedDate = Convert.ToDateTime("01/01/" + DateTime.Now.Year.ToString());
                    _co.filtraOrd();
                    _co.ShowDialog();
                }
            }
        }
        private void DtgDatosAModificar1_PreviewMouseUp(object sender, MouseButtonEventArgs e)
        {
            if (RdbProduccion.IsChecked == true || RdbNovedades.IsChecked == true)//FJRF - Si chequedado cualquiera de los dos hacemos lo siguiente
            {
                #region FJRF - Saber Fila y Columna indexada

                int IntColumnaIndexada, IntFilaIndexada;
                DependencyObject dep = (DependencyObject)e.OriginalSource;

                //Stepping through the visual tree
                while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                //Is the dep a cell or outside the bounds of Window1?
                if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
                {
                    return;
                }
                else
                {
                    System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                    cell = (System.Windows.Controls.DataGridCell)dep;
                    while ((dep != null) && !(dep is DataGridRow))
                    {
                        dep = VisualTreeHelper.GetParent(dep);
                    }

                    if (dep == null)
                    {
                        return;
                    }
                    int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                    IntColumnaIndexada = colindex;

                    DataGridRow row = dep as DataGridRow;
                    System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                    int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                    IntFilaIndexada = rowindex;
                }
                #endregion

                int IntColumnaImagen = DtgDatosAModificar1.Columns.Count - 1;//FJRF - Esta es la columnas de las imagenes
                int IntColumnaSeleccionado = DtgDatosAModificar1.Columns.Count - 2;//FJRF - Esta es la columnas que nos dice si esta o no seleccionado

                if (IntColumnaIndexada == IntColumnaImagen)//FJRF - Si la columnas es la que tiene el chek hacemos lo siguiente
                {
                    String StrSeleccionado = DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaSeleccionado].ToString();//FJRF - Convertimos el objeto en algo manipulable
                    if (StrSeleccionado == "SI")//FJRF - Si esta seleccionado hacemos lo siguiente
                    {
                        DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaSeleccionado] = "NO";//FJRF - Quitamos la seleccion
                        DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaImagen] = "/produccion;component/Images/ImagenTrasparente.png";//FJRF - Ponemos una imagen trasparente

                        CkbSeleccionarTodo.IsChecked = false;//FJRF - Quitamos la seleccion de todos en el seleccionador
                    }
                    if (StrSeleccionado == "NO")//FJRF - Si no esta seleccionado hacemos lo siguiente
                    {
                        DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaSeleccionado] = "SI";//FJRF - Seleccionamos
                        DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaImagen] = "/produccion;component/Images/ok1.png";//FJRF - Ponemos una imagen de seleccion
                    }
                }
            }
        }
        private void DtgDatosAModificar1_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (RdbProduccion.IsChecked == true || RdbNovedades.IsChecked == true)//FJRF - Si chequedado cualquiera de los dos hacemos lo siguiente
            {
                #region FJRF - Saber Fila y Columna indexada

                int IntColumnaIndexada, IntFilaIndexada;
                DependencyObject dep = (DependencyObject)e.OriginalSource;

                //Stepping through the visual tree
                while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                //Is the dep a cell or outside the bounds of Window1?
                if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
                {
                    return;
                }
                else
                {
                    System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                    cell = (System.Windows.Controls.DataGridCell)dep;
                    while ((dep != null) && !(dep is DataGridRow))
                    {
                        dep = VisualTreeHelper.GetParent(dep);
                    }

                    if (dep == null)
                    {
                        return;
                    }
                    int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                    IntColumnaIndexada = colindex;

                    DataGridRow row = dep as DataGridRow;
                    System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                    int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                    IntFilaIndexada = rowindex;
                }
                #endregion

                int IntFilaActual, IntCantidadRegistros, IntRegistrosActuales;//FJRF Creamos las variables que necesitamos para el proceso actual

                IntCantidadRegistros = DtgDatosAModificar1.Items.Count;//FJRF - Traemos la cantidad de filas que tenga el grid

                IntFilaActual = IntFilaIndexada + 1;//FJRF - La fila actual es la fila indexada mas uno porque empieza en cero
                IntRegistrosActuales = IntCantidadRegistros - 1;//FJRF - Los registros actuales es la cantidad de filas menos una porque siempre debe de sobrar una

                if (RdbProduccion.IsChecked == true)//FJRF - Si produccion esta chequedado hacemos lo siguiente
                {
                    #region FJRF - CodigoParaPasarElFocoDentroDelGridProduccion
                    var elemento = e.OriginalSource as UIElement;
                    if (e.Key == Key.Enter && elemento != null)
                    {
                        if (IntColumnaIndexada == 7 || IntColumnaIndexada == 8 || IntColumnaIndexada == 9)//FJRF - Si la columna equivale al codigo hacemos lo siguiente
                        {
                            if (IntFilaIndexada < IntRegistrosActuales)
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                SelectCellByIndex(DtgDatosAModificar, IntFilaActual, 4);//FJRF - Le decimos cual es la nueva posicion
                            }
                            else
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                SelectCellByIndex(DtgDatosAModificar, 0, 4);//FJRF - Le decimos cual es la nueva posicion
                            }
                        }
                        else//FJRF - si no es la columna de control hacemos lo siguiente
                        {
                            e.Handled = true;
                            elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                        }
                    }
                    #endregion
                }
                else//FJRF - Si entro por novedades hacemos lo siguiente
                {
                    #region FJRF - CodigoParaPasarElFocoDentroDelGridNovedades
                    var elemento = e.OriginalSource as UIElement;
                    if (e.Key == Key.Enter && elemento != null)
                    {
                        if (IntColumnaIndexada == 4 || IntColumnaIndexada == 5 || IntColumnaIndexada == 6)//FJRF - Si la columna equivale al codigo hacemos lo siguiente
                        {
                            if (IntFilaIndexada < IntRegistrosActuales)
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                SelectCellByIndex(DtgDatosAModificar1, IntFilaActual, 4);//FJRF - Le decimos cual es la nueva posicion
                            }
                            else
                            {
                                e.Handled = true;//FJRF - Le decimos que vamos a trabajar sobre un control
                                SelectCellByIndex(DtgDatosAModificar1, 0, 4);//FJRF - Le decimos cual es la nueva posicion
                            }
                        }
                        else//FJRF - si no es la columna de control hacemos lo siguiente
                        {
                            e.Handled = true;
                            elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                        }
                    }
                    #endregion
                }
            }
        }
        private void CkbSeleccionarTodo_Click(object sender, RoutedEventArgs e)
        {
            int IntColumnaImagen, IntColumnaSeleccionado;//FJRF - Creamos las variables

            if (DtgDatosAModificar.Visibility == Visibility.Visible)
            {
                IntColumnaImagen = DtgDatosAModificar.Columns.Count - 1;//FJRF - Esta es la columnas de las imagenes
                IntColumnaSeleccionado = DtgDatosAModificar.Columns.Count - 2;//FJRF - Esta es la columnas que nos dice si esta o no seleccionado
            }
            else
            {
                IntColumnaImagen = DtgDatosAModificar1.Columns.Count - 1;//FJRF - Esta es la columnas de las imagenes
                IntColumnaSeleccionado = DtgDatosAModificar1.Columns.Count - 2;//FJRF - Esta es la columnas que nos dice si esta o no seleccionado
            }

            int IntFilaIndexada = 0;//FJRF - Creamos la columna que manejara las filas
            foreach (DataRow row in DtDatosConsultados.Rows)
            {
                if (CkbSeleccionarTodo.IsChecked == true)//FJRF - Si la columnas es la que tiene el chek hacemos lo siguiente
                {
                    DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaSeleccionado] = "SI";//FJRF - Seleccionamos
                    DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaImagen] = "/produccion;component/Images/ok1.png";//FJRF - Ponemos una imagen de seleccion
                }
                else//FJRF - Si no esta seleccionado hacemos lo siguiente
                {
                    DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaSeleccionado] = "NO";//FJRF - Quitamos la seleccion
                    DtDatosConsultados.Rows[IntFilaIndexada][IntColumnaImagen] = "/produccion;component/Images/ImagenTrasparente.png";//FJRF - Ponemos una imagen trasparente
                }
                IntFilaIndexada++;//FJRF - Aumentamos el contador de lineas
            }
        }



        private void BtnNuevo_Click(object sender, RoutedEventArgs e)
        {
            PttV_Limpiar();//FJRF - Limpiamos los datos
        }
        private void BtnGuardar_Click(object sender, RoutedEventArgs e)
        {
            PttV_Guardar();//FJRF - Guardar los datos
            PttV_BuscarDatos();//FJRF - Refrescamos los datos
        }
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();//FJRF - Nos salimos del formulario
        }
        #endregion

        #region FJRF - Procedimientos y funciones
        //FJRF - Con esta funcion cargamos los combos (Cargar combos)
        private Boolean CargarCombo(ComboBox CboComboACargar, string strConsultaOracle, string strSelectedValuePath, string strDisplayMemberPath)
        {
            Boolean BooSiHayDatos = false;//FJRF - Variable para informar si hay datos o no
            CboComboACargar.ItemsSource = null;
            CboComboACargar.Items.Clear();//FJRF - Borramos los posibles datos que pueda tener el combo

            DtConsulta = new DataTable();//FJRF - Inicializamos la variable
            DsConsulta = new DataSet();//FJRF - Inicializamos la variable

            DtConsulta = MdoGeneral.consulta(strConsultaOracle);//FJRF - Realizamos la consulta y retornamos los datos

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                BooSiHayDatos = true;//FJRF - Informamos que hay datos

                DataRow drEncabezado;
                drEncabezado = DtConsulta.NewRow();

                drEncabezado[strSelectedValuePath] = "ZZZ999";
                drEncabezado[strDisplayMemberPath] = "Digite o seleccione";

                DtConsulta.Rows.Add(drEncabezado);

                DsConsulta.Tables.Add(DtConsulta);//FJRF - Adicionameos el datatable al dataset
                CboComboACargar.ItemsSource = DsConsulta.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboComboACargar.SelectedValuePath = strSelectedValuePath;//FJRF - Cargamos la posicion
                CboComboACargar.DisplayMemberPath = strDisplayMemberPath;//FJRF - Decimos cual dato se mostrara

                CboComboACargar.SelectedIndex = 0;//FJRF - Ponemos el combo en la primera posicion
            }
            return BooSiHayDatos;//FJRF - Avisamos que si hay o no hay datos
        }
        protected void PttV_Limpiar()
        {
            RdbProduccion.IsChecked = false;
            RdbNovedades.IsChecked = false;

            CboAño.ItemsSource = null;//FJRF - Desvinculamos el objeto
            CboAño.Items.Clear();//FJRF - Quitamos los datos

            CboSemana.ItemsSource = null;//FJRF - Desvinculamos el objeto
            CboSemana.Items.Clear();//FJRF - Quitamos los datos

            CboProcesoSeleccionado.ItemsSource = null;//FJRF - Desvinculamos el objeto
            CboProcesoSeleccionado.Items.Clear();//FJRF - Quitamos los datos
            
            DtgDatosAModificar.ItemsSource = null;
            DtgDatosAModificar1.ItemsSource = null;

            DtDatosConsultados = null;

            DtgDatosAModificar.Items.Clear();
            DtgDatosAModificar1.Items.Clear();

            CkbSeleccionarTodo.IsChecked = false;//FJRF - Quitamos la seleccion de todos en el seleccionador

            RdbProduccion.Focus();
        }

        protected void PttV_Guardar()
        {
            if (RdbProduccion.IsChecked == true || RdbNovedades.IsChecked == true)//FJRF - Si chequedado cualquiera de los dos hacemos lo siguiente
            {
                #region FJRF - PreguntamosSiQueremosGuardar
                String StrCaptionBox = "CONFIRMACIÓN";
                String StrMensajeBox = "Esta seguro de guardar los datos?";
                MessageBoxButton buttons = MessageBoxButton.YesNo;
                MessageBoxImage icon = MessageBoxImage.Question;
                #endregion

                if (MessageBox.Show(StrMensajeBox, StrCaptionBox, buttons, icon) == MessageBoxResult.Yes)//FJRF - Si el usuario quiere guardar hacemos lo siguiente
                {
                    int IntRegistroNumero = -1;//FJRF - Para mirar el registro en el que va
                    String StrDatoError = "";//FJRF - Para detectar donde hay un error
                    try//FJRF - Controlamos si se presenta un error
                    {
                        Mouse.OverrideCursor = Cursors.Wait;//FJRF - Pone el cursor en modo de espera

                        if (RdbProduccion.IsChecked == true)//FJRF - Si produccion esta chequedado hacemos lo siguiente
                        {
                            String StrOrden = "", StrConsecutivo = "", StrCodigoEmpleado = "", StrNombreEmpleado = "", StrCantidad = "", StrPorcentaje = "", StrValorCategoria = "", StrValor = "", StrEliminar = "";//FJRF - Creamos las variables que necesitamos para este proceso
                            for (int IntFilaRecorrida = 0; IntFilaRecorrida < DtgDatosAModificar.Items.Count; IntFilaRecorrida++)
                            {
                                IntRegistroNumero++;//FJRF - Sumamos el registro

                                #region FJRF - Extraemos los datos del grid
                                StrOrden = ((System.Data.DataRowView)(DtgDatosAModificar.Items[IntFilaRecorrida])).Row.ItemArray[0].ToString();//FJRF - Extraemos el dato del grid
                                StrConsecutivo = ((System.Data.DataRowView)(DtgDatosAModificar.Items[IntFilaRecorrida])).Row.ItemArray[1].ToString();//FJRF - Extraemos el dato del grid
                                StrCodigoEmpleado = ((System.Data.DataRowView)(DtgDatosAModificar.Items[IntFilaRecorrida])).Row.ItemArray[2].ToString();//FJRF - Extraemos el dato del grid
                                StrNombreEmpleado = ((System.Data.DataRowView)(DtgDatosAModificar.Items[IntFilaRecorrida])).Row.ItemArray[3].ToString();//FJRF - Extraemos el dato del grid
                                StrCantidad = ((System.Data.DataRowView)(DtgDatosAModificar.Items[IntFilaRecorrida])).Row.ItemArray[4].ToString();//FJRF - Extraemos el dato del grid
                                StrPorcentaje = ((System.Data.DataRowView)(DtgDatosAModificar.Items[IntFilaRecorrida])).Row.ItemArray[5].ToString();//FJRF - Extraemos el dato del grid
                                StrValorCategoria = ((System.Data.DataRowView)(DtgDatosAModificar.Items[IntFilaRecorrida])).Row.ItemArray[6].ToString();//FJRF - Extraemos el dato del grid
                                StrValor = ((System.Data.DataRowView)(DtgDatosAModificar.Items[IntFilaRecorrida])).Row.ItemArray[7].ToString();//FJRF - Extraemos el dato del grid

                                StrEliminar = ((System.Data.DataRowView)(DtgDatosAModificar.Items[IntFilaRecorrida])).Row.ItemArray[8].ToString();//FJRF - Extraemos el dato del grid

                                if (String.IsNullOrEmpty(StrCantidad) == true) { StrCantidad = "0"; }//FJRF - Si no trae datos le asignamos un cero por defecto
                                if (String.IsNullOrEmpty(StrPorcentaje) == true) { StrPorcentaje = "0"; }//FJRF - Si no trae datos le asignamos un cero por defecto
                                if (String.IsNullOrEmpty(StrValorCategoria) == true) { StrValorCategoria = "0"; }//FJRF - Si no trae datos le asignamos un cero por defecto
                                if (String.IsNullOrEmpty(StrValor) == true) { StrValor = "0"; }//FJRF - Si no trae datos le asignamos un cero por defecto

                                StrDatoError = StrOrden + " - " + StrCodigoEmpleado + " - " + StrNombreEmpleado;//FJRF - Guardamos un dato con el cual identifiquemos el error
                                #endregion

                                #region FJRF - Guardamos o eliminamos los datos
                                if (StrEliminar == "SI")//FJRF - Si esta seleccionado entonces hacemos lo siguiente
                                {
                                    PttV_DeleteProcesoProduccion(StrOrden, StrConsecutivo, StrCodigoEmpleado, StrNombreEmpleado, StrCantidad, StrPorcentaje, StrValorCategoria, StrValor);//FJRF - Eliminamos los datos de produccion
                                }
                                else//FJRF - Si no esta seleccionado hacemos lo siguiente
                                {
                                    PttV_UpdateProcesoProduccion(StrOrden, StrConsecutivo, StrCodigoEmpleado, StrNombreEmpleado, StrCantidad, StrPorcentaje, StrValorCategoria, StrValor);//FJRF - Actualizamos los datos de produccion
                                }
                                #endregion
                            }
                        }
                        else//FJRF - Si entro por novedades hacemos lo siguiente
                        {
                            String StrConsecutivo = "", StrCodigoEmpleado = "", StrNombreEmpleado = "", StrConcepto = "", StrValor = "", StrEliminar = "";//FJRF - Creamos las variables que necesitamos para este proceso
                            for (int IntFilaRecorrida = 0; IntFilaRecorrida < DtgDatosAModificar1.Items.Count; IntFilaRecorrida++)
                            {
                                IntRegistroNumero++;//FJRF - Sumamos el registro

                                #region FJRF - Extraemos los datos del grid
                                StrConsecutivo = ((System.Data.DataRowView)(DtgDatosAModificar1.Items[IntFilaRecorrida])).Row.ItemArray[0].ToString();//FJRF - Extraemos el dato del grid
                                StrCodigoEmpleado = ((System.Data.DataRowView)(DtgDatosAModificar1.Items[IntFilaRecorrida])).Row.ItemArray[1].ToString();//FJRF - Extraemos el dato del grid
                                StrNombreEmpleado = ((System.Data.DataRowView)(DtgDatosAModificar1.Items[IntFilaRecorrida])).Row.ItemArray[2].ToString();//FJRF - Extraemos el dato del grid
                                StrConcepto = ((System.Data.DataRowView)(DtgDatosAModificar1.Items[IntFilaRecorrida])).Row.ItemArray[3].ToString();//FJRF - Extraemos el dato del grid
                                StrValor = ((System.Data.DataRowView)(DtgDatosAModificar1.Items[IntFilaRecorrida])).Row.ItemArray[4].ToString();//FJRF - Extraemos el dato del grid

                                StrEliminar = ((System.Data.DataRowView)(DtgDatosAModificar1.Items[IntFilaRecorrida])).Row.ItemArray[5].ToString();//FJRF - Extraemos el dato del grid

                                if (String.IsNullOrEmpty(StrValor) == true) { StrValor = "0"; }//FJRF - Si no trae datos le asignamos un cero por defecto

                                #endregion

                                #region FJRF - Guardamos o eliminamos los datos
                                if (StrEliminar == "SI")//FJRF - Si esta seleccionado entonces hacemos lo siguiente
                                {
                                    PttV_DeleteProcesoNovedades(StrConsecutivo, StrCodigoEmpleado, StrNombreEmpleado, StrConcepto, StrValor);//FJRF - Eliminamos los datos de novedades
                                }
                                else//FJRF - Si no esta seleccionado hacemos lo siguiente
                                {
                                    PttV_UpdateProcesoNovedades(StrConsecutivo, StrCodigoEmpleado, StrNombreEmpleado, StrConcepto, StrValor);//FJRF - Actualizamos los datos de novedades
                                }
                                #endregion
                            }
                        }

                        MessageBox.Show("Información actualizada con exito", "PROCESO EXITOSO", MessageBoxButton.OK, MessageBoxImage.Information);//FJRF - Enviamos mensaje de cancelación
                        Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal
                    }
                    catch (Exception ex)//FJRF - Si hay un error hacemos lo siguiente
                    {
                        Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal
                        MessageBox.Show("Registro [ " + IntRegistroNumero + " ] - [ " + StrDatoError + " ] - " + ex.Message, "ERROR AL GUARDAR", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Si se genera un error informamos al usuario que paso
                    }
                }
                else//FJRF - Si el usuario no quieres guardar hacemos lo siguiente
                {
                    Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Pone el cursor de forma normal
                    MessageBox.Show("No se guardaron los datos", "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos mensaje de cancelación
                }
            }
            else//FJRF - Si no hay nada seleccionado hacemos lo siguiente
            {
                MessageBox.Show("No hay ningun proceso seleccionado","PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);//FJRF - Enviamos un mensaje al usuario
            }
        }
        protected void PttV_UpdateProcesoNovedades(string strConsecutivo, string strCodigoEmpleado, string strNombreEmpleado, string strConcepto, string strValor)
        {
            StrConsulta = "UPDATE NOVPRD ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "SET VLRNOV_NVP = '" + strValor + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "WHERE CONSEC_NVP = '" + strConsecutivo + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CODEMP_NVP = '" + strCodigoEmpleado + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND ANO_NVP = '" + CboAño.SelectedValue + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND SEM_NVP = '" + CboSemana.SelectedValue + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CODPRC_NVP = '" + CboProcesoSeleccionado.SelectedValue + "' ";//FJRF - Armamos la consulta

            MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta
        }
        protected void PttV_DeleteProcesoNovedades(string strConsecutivo, string strCodigoEmpleado, string strNombreEmpleado, string strConcepto, string strValor)
        {
            StrConsulta = "DELETE NOVPRD ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "WHERE CONSEC_NVP = '" + strConsecutivo + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CODEMP_NVP = '" + strCodigoEmpleado + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND ANO_NVP = '" + CboAño.SelectedValue + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND SEM_NVP = '" + CboSemana.SelectedValue + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CODPRC_NVP = '" + CboProcesoSeleccionado.SelectedValue + "' ";//FJRF - Armamos la consulta

            MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta
        }
        protected void PttV_UpdateProcesoProduccion(string strOrden, string strConsecutivo, string strCodigoEmpleado, string strNombreEmpleado, string strCantidad, string strPorcentaje, string strValorCategoria, string strValor)
        {
            StrConsulta = "UPDATE REPPRO ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "SET CANREP_RPP = '" + strCantidad + "', PORCEN_RPP = '" + strPorcentaje + "', VLRCTG_RPP = '" + strValorCategoria + "', VLRVLR_RPP = '" + strValor + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "WHERE NROORD_RPP = '" + strOrden + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CONSEC_RPP = '" + strConsecutivo + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CODEMP_RPP = '" + strCodigoEmpleado + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND ANO_RPP = '" + CboAño.SelectedValue + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND SEM_RPP = '" + CboSemana.SelectedValue + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CODPRC_RPP = '" + CboProcesoSeleccionado.SelectedValue + "' ";//FJRF - Armamos la consulta

            MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta
        }
        protected void PttV_DeleteProcesoProduccion(string strOrden, string strConsecutivo, string strCodigoEmpleado, string strNombreEmpleado, string strCantidad, string strPorcentaje, string strValorCategoria, string strValor)
        {
            StrConsulta = "DELETE REPPRO ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "WHERE NROORD_RPP = '" + strOrden + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CONSEC_RPP = '" + strConsecutivo + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CODEMP_RPP = '" + strCodigoEmpleado + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND ANO_RPP = '" + CboAño.SelectedValue + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND SEM_RPP = '" + CboSemana.SelectedValue + "' ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "AND CODPRC_RPP = '" + CboProcesoSeleccionado.SelectedValue + "' ";//FJRF - Armamos la consulta

            MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta
        }


        protected void ComboEnPosicionConNombre(ComboBox Cbo, String StrNombreDondeDebePosicionar)
        {
            int IntFilaActual = -1;
            String StrDatoCombo = "";
            foreach (System.Data.DataRowView cmbItem in Cbo.Items)
            {
                IntFilaActual++;
                StrDatoCombo = cmbItem.Row.ItemArray[0].ToString();
                if (StrDatoCombo == StrNombreDondeDebePosicionar)
                { 
                    break; 
                }
            }
            Cbo.SelectedIndex =IntFilaActual;
        }

        #region FJRF - FuncionesEspecialesParaLasPropiedadesDeLaCeldaYElFoco

        public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                if (child != null && child is T)
                    return (T)child;
                else
                {
                    T childOfChild = FindVisualChild<T>(child);
                    if (childOfChild != null)
                        return childOfChild;
                }
            }
            return null;
        }
        public static DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column)
        {
            if (rowContainer != null)
            {
                DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                if (presenter == null)
                {
                    /* if the row has been virtualized away, call its ApplyTemplate() method 
                     * to build its visual tree in order for the DataGridCellsPresenter
                     * and the DataGridCells to be created */
                    rowContainer.ApplyTemplate();
                    presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                }
                if (presenter != null)
                {
                    DataGridCell cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    if (cell == null)
                    {
                        /* bring the column into view
                         * in case it has been virtualized away */
                        dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[column]);
                        cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    }
                    return cell;
                }
            }
            return null;
        }
        public static void SelectRowByIndexes(DataGrid dataGrid, params int[] rowIndexes)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.FullRow))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to FullRow.");

            if (!dataGrid.SelectionMode.Equals(DataGridSelectionMode.Extended))
                throw new ArgumentException("The SelectionMode of the DataGrid must be set to Extended.");

            if (rowIndexes.Length.Equals(0) || rowIndexes.Length > dataGrid.Items.Count)
                throw new ArgumentException("Invalid number of indexes.");

            dataGrid.SelectedItems.Clear();
            foreach (int rowIndex in rowIndexes)
            {
                if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                    throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

                object item = dataGrid.Items[rowIndex]; //=Product X
                dataGrid.SelectedItems.Add(item);

                DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                if (row == null)
                {
                    dataGrid.ScrollIntoView(item);
                    row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                }
                if (row != null)
                {
                    DataGridCell cell = GetCell(dataGrid, row, 0);
                    if (cell != null)
                        cell.Focus();
                }
            }
        }
        public static void SelectCellByIndex(DataGrid dataGrid, int rowIndex, int columnIndex)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.Cell))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to Cell.");

            if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

            if (columnIndex < 0 || columnIndex > (dataGrid.Columns.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid column index.", columnIndex));

            dataGrid.SelectedCells.Clear();

            object item = dataGrid.Items[rowIndex]; //=Product X
            DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            if (row == null)
            {
                dataGrid.ScrollIntoView(item);
                row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            }
            if (row != null)
            {
                DataGridCell cell = GetCell(dataGrid, row, columnIndex);
                if (cell != null)
                {
                    DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(cell);
                    dataGrid.SelectedCells.Add(dataGridCellInfo);

                    cell.Focus();
                }
            }
        }
        #endregion

        #endregion
    }
}

